'''
 案例10.1完整代码：使用easySpider模块爬取武侠小说中所有金庸小说
'''
# 1.导入easySpider模块
import easySpider
import os,time

#2. 调用easySpider模块，实例化爬虫类jyBookSpider
jyurl = 'http://www.wuxia.net.cn/author/jinyong.html'
jyBookSpider=easySpider.Spider(url=jyurl)
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

#3. 调用jyBookSpider对象的beautifulsoup解析方法，获得小说名
jyBookNames = jyBookSpider.beautifulsoup_getTarget(selector='.co3 a')
#4. 调用jyStory对象的re正则匹配表达式，获得小说网页链接
jyBookLinks = jyBookSpider.re_getTarget(pattern='href="(.*?)">.*?</a></li>')
jyBookUrls=jyBookLinks[6:]

#5.在当前myProject目录下创建小说总目录
root_path ='金庸小说'
if not os.path.exists(root_path):
    os.mkdir('金庸小说')

#6.遍历爬取所有小说
print(time.asctime())
root_url='http://www.wuxia.net.cn'
for url,item in zip(jyBookUrls,jyBookNames):
    #BookUrl为每部小说的首页链接地址
    BookUrl = root_url+url
    #给每部小说创建一个爬虫实例jyBookListSpider
    jyBookListSpider = easySpider.Spider(url=BookUrl, headers=headers)

    #爬取首页内容简介,并保存到每部小说目录中去
    StoryBrief = jyBookListSpider.beautifulsoup_getTarget(selector='div.description p')
    #为每部小说设定以小说名为名称的目录，如果不存在就创建一个
    Bookpath = root_path + '/' + item
    if not os.path.exists(Bookpath):
        os.mkdir(Bookpath)

    #《鸳鸯刀》和《越女剑》两部小说只有一个首页页面，文本就在这个页面，没有内容简介和章回
    # 因此获取到的内容简介肯定为空，策略是直接将首页页面内容爬取下来保存
    if not StoryBrief:
        print("开始爬取{}小说".format(item))
        StoryDetail = jyBookListSpider.beautifulsoup_getTarget(selector='div.text > p')
        with open(Bookpath+'/'+item+'.dat','w') as f:
            for paragraph in StoryDetail:
                f.write(paragraph)
                f.write('\n')
        print("{}小说内容爬取完毕!".format(item))

    #将爬取到的内容简介文本保存到每部小说目录下内容简介.dat文件中
    with open(Bookpath+'/内容简介.dat','w') as f:
        for text in StoryBrief:
            f.write(text)
            f.write('\n')
    print("当前小说{}的内容简介保存完毕！".format(item))

    #爬取每回的标题ChapterTitle，确定一共多少回数目ChapterNumbers
    ChapterTitle = jyBookListSpider.beautifulsoup_getTarget(selector='div.book dd')
    ChapterNumbers=len(ChapterTitle)
    print("当前小说{}共{}回".format(item,ChapterNumbers))

    print("开始爬取当前小说每回内容....")
    for number in range(1,ChapterNumbers+1):
        #每部小说章节URL构建方式是小说名/章节数
        BookChapterUrls = BookUrl[:-5] + '/' + str(number)+'.html'

        #为每次爬取章节构建一个easySpider爬虫实例
        ChapterSpider = easySpider.Spider(url=BookChapterUrls,headers=headers)

        print("开始爬取第{}回...".format(number))
        ChapterText = ChapterSpider.beautifulsoup_getTarget(selector='div.text > p')

        #将爬取到的内容保存到每部小说目录下，文件以章回标题命名
        with open(Bookpath+'/第'+str(number)+'回.dat','w',encoding = 'utf-8') as f:
            for paragraph in ChapterText:
                f.write(paragraph)
                f.write('\n')

        print("当前小说{}第{}回保存完毕...".format(item,number))

    print('当前小说爬取完毕！休息5秒后开始爬取下一部小说\n')
    print(time.asctime())
    time.sleep(5)